package main

import "fmt"

/*
通道的使用
通道用于在两个线程池之间通信。
通道（channel）使用来传递数据的一个数据结构。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。
操作符 <- 用于指定通道的方向，发送或接收，如果未指定方向，则为双通道。
ch <- v   //把v发送到通道ch
v :=<-ch  //从 ch 接收数据 并把值赋给v

声明一个通道很简单，我们使用 chan 关键字即可，通道在使用前必须先创建：
 ch :=make(chan int)
注意：默认情况下，通道是不带缓冲区的。发送端发送数据，同时必须需有接收端接收相应的数据。

*/

// 计算 s 数组中的数字之和，并把结果传给通道 c
func sum(s []int, c chan int) {
	sum := 0
	for _, v := range s {
		sum += v
	}
	c <- sum // 把 sum 发送到通道 c
}

func main() {
	s := []int{7, 2, 8, -9, 4, 0}

	c := make(chan int)
	go sum(s[:len(s)/2], c) //计算数组中后一半的数据的和
	go sum(s[len(s)/2:], c) //计算数组中前一半的数据的和
	x, y := <-c, <-c        // 从通道 c 中接收

	fmt.Println(x, y, x+y)
}
